#include "stm32f4xx.h"                  // Device header
#include "board.h"
#include "myiic.h"


/*
@IIC-GPIO_Init
@param :NULL
@retval : NULL
*/
void My_iic_Init(void)
{
//    uint32_t i,j;
//    for(i = 0;i<1000;i++)
//    {
//        for(j = 0;j<1000;j++);
//    }
    
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_SCL;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(PORT_SCL, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_SDA;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(PORT_SDA, &GPIO_InitStructure);
}

/**
 * @Write_SDA
 * @param  : BitValue
 * @retval : NULL
*/
void Write_SDA(uint8_t BitValue)
{
    GPIO_WriteBit(PORT_SDA,GPIO_SDA,BitValue);
    delay_us(5);
}

/**
 * @Write_SCL
 * @param  : BitValue
 * @retval : NULL
*/
void Write_SCL(uint8_t BitValue)
{
    GPIO_WriteBit(PORT_SCL,GPIO_SCL,BitValue);
    delay_us(5);
}

/**
 * @Read_SDA
 * @param : NULL
 * @retval : uint8_t BitValue
*/
uint8_t Read_SDA(void)
{
    uint8_t BitValue;
    BitValue = GPIO_ReadInputDataBit(PORT_SDA,GPIO_SDA);
    delay_1us(5);
    return BitValue;
}

/**
 * IIC_Start
 * @param : NULL
 * @retval : NULL
*/
void IIC_Start()
{
    Write_SDA(1);
    Write_SCL(1);
    Write_SDA(0);
    Write_SCL(0); 
}

/**
 * IIC_Stop
 * @param : NULL
 * @retval : NULL
*/
void IIC_Stop()
{
    Write_SDA(0);
    Write_SCL(1);
    Write_SDA(1);
}
/**
 * @SendAck
 * @param : AckBit
 * @retval : NULL
*/
void MyIIC_SendAck(uint8_t AckBit)
{
    Write_SDA(AckBit);
    Write_SCL(1);
    Write_SCL(0);
}
/**
 * @ReceiveAck
 * @param : NULL
 * @retval : NULL
*/
uint8_t MyIIC_ReceiveAck(void)
{
    uint8_t AckBit;
    Write_SDA(1);
    Write_SCL(1);
    AckBit = Read_SDA();
    Write_SCL(0);
    return AckBit;
}

void MyIIC_SendByte(uint8_t Byte)
{
    uint8_t i ;
    for(i =0;i<8;i++)
    {
        Write_SDA(Byte & (0x80>>i));           //高位先行，依次比较
        Write_SCL(1);
        Write_SCL(0);
    }
}

uint8_t MyIIC_ReceiveByte(void)
{
    uint8_t i,Byte = 0x00;
    Write_SDA(1);
    for(i = 0;i<8;i++)
    {
        Write_SCL(1);
        if(Read_SDA()==1)
        {
            Byte |=(0x80 >>i);
        }
        Write_SCL(0); 
    }
    return Byte;
}